home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland Pascal with Objects 7.0 / WINDEMOS.ZIP / WMENU.PAS < prev    next >
Pascal/Delphi Source File  |  1992-10-27  |  5KB  |  186 lines

  1. {************************************************}
  2. {                                                }
  3. {   Demo Program                                 }
  4. {   Copyright (c) 1992 by Borland International  }
  5. {                                                }
  6. {************************************************}
  7.  
  8. program WMenu;
  9.  
  10. {$R WMenu}
  11.  
  12. uses WinProcs, WinTypes;
  13.  
  14. type
  15.   TList = array[1..99] of String[17];
  16.  
  17. const
  18.   ListCount: Word = 0;
  19.  
  20. var
  21.   UserMenu: hMenu;
  22.   List: TList;
  23.   MenuName: string[17];
  24.   Window: hWnd;
  25.  
  26. function AboutProc(Dlg: hWnd; iMessage, wParam: Word; lParam: LongInt): Bool; Export;
  27. begin
  28.   AboutProc := false;
  29.   case iMessage of
  30.     WM_Create: AboutProc:=true;
  31.     WM_Command:
  32.       if (wParam = IDOK) or (wParam = IDCancel) then
  33.       begin
  34.     AboutProc := True;
  35.     EndDialog(Dlg, 0);
  36.       end;
  37.   end;
  38. end;
  39.  
  40. function CreateProc(Dlg: hWnd; iMessage, wParam: Word; lParam: LongInt): WordBool; export;
  41. var
  42.   Style: Word;
  43.   Name: string[17];
  44.   Found: Boolean;
  45.   I: Integer;
  46.   R: TRect;
  47. begin
  48.   CreateProc:=False;
  49.   case iMessage of
  50.     WM_InitDialog:
  51.       CreateProc := True;
  52.     WM_Command:
  53.       case wParam of
  54.     IDCancel:
  55.           begin
  56.         EndDialog(Dlg, 0);
  57.         CreateProc := True;
  58.       end;
  59.     104:
  60.           begin
  61.         Name[0] := Char(GetWindowText(GetDlgItem(Dlg, 103), @Name[1], 16));
  62.         Found := False;
  63.         for I := 1 to ListCount do
  64.           if Name = List[I] then
  65.           begin
  66.         Found := True;
  67.         DeleteMenu(UserMenu, I+300, MF_ByCommand);
  68.           end;
  69.           if MenuName = Name then
  70.           begin
  71.         MenuName := '';
  72.         GetClientRect(Window, R);
  73.         InvalidateRect(Window, @R, True);
  74.           end;
  75.           if Not found then
  76.         MessageBox(Dlg, 'Item Not Found', 'Error', MB_OK)
  77.           else
  78.         EndDialog(Dlg, 0);
  79.       end;
  80.     IDOK:
  81.           begin
  82.         if SendMessage(GetDlgItem(Dlg, 101), BM_GetCheck, 0,0) = 0 then
  83.           Style := MF_UnChecked
  84.         else
  85.           Style := MF_Checked;
  86.         if SendMessage(GetDlgItem(Dlg, 102), BM_GetCheck, 0,0) = 0 then
  87.           Style := Style or MF_Enabled
  88.         else
  89.           Style := Style or MF_Grayed;
  90.         Name[0]:=Char(GetWindowText(GetDlgItem(Dlg, 103), @Name[1], 16));
  91.         Inc(ListCount);
  92.         if ListCount > 99 then
  93.         begin
  94.           MessageBox(Dlg, 'Too many menus', 'Error', MB_OK);
  95.           Exit;
  96.         end;
  97.         List[ListCount] := Name;
  98.         AppendMenu(UserMenu, Style or MF_String, ListCount+300, @Name[1]);
  99.         EndDialog(Dlg, 0);
  100.         CreateProc := True;
  101.       end;
  102.       end;
  103.   end;
  104. end;
  105.  
  106. function WindowProc(Wnd: hWnd; iMessage, wParam:Word; lParam: LongInt): LongInt; export;
  107. var
  108.   ProcInst: Pointer;
  109.   DC: hDC;
  110.   PaintStruct: TPaintStruct;
  111.   R: TRect;
  112. begin
  113.   case iMessage of
  114.     WM_Command:
  115.       case WParam of
  116.         100:
  117.           begin
  118.         ProcInst := MakeProcInstance(@CreateProc, hInstance);
  119.         DialogBox(hInstance, 'CreateDlg', Wnd, ProcInst);
  120.         FreeProcInstance(ProcInst);
  121.       end;
  122.         106:
  123.           begin
  124.         ProcInst := MakeProcInstance(@AboutProc, hInstance);
  125.         DialogBox(hInstance, 'About', Wnd, ProcInst);
  126.         FreeProcInstance(ProcInst);
  127.       end;
  128.         301..399:
  129.           begin
  130.         MenuName := List[wParam-300];
  131.         GetClientRect(Window, R);
  132.         InvalidateRect(Window, @R, true);
  133.       end;
  134.         else
  135.       WindowProc:=DefWindowProc(Wnd, iMessage, wParam, lParam);
  136.       end;
  137.       WM_Paint:
  138.         begin
  139.       DC := BeginPaint(Wnd, PaintStruct);
  140.       TextOut(DC, 0, 0, @MenuName[1], Length(MenuName));
  141.       EndPaint(Wnd, PaintStruct);
  142.     end;
  143.       WM_Destroy:
  144.         PostQuitMessage(0);
  145.     else
  146.       WindowProc := DefWindowProc(Wnd, iMessage, wParam, lParam);
  147.   end;
  148. end;
  149.  
  150. procedure WinMain;
  151. var
  152.   WndClas: TWndClass;
  153.   Msg: TMsg;
  154. begin
  155.   if hPrevInst = 0 then
  156.   begin
  157.     WndClas.Style := 0;
  158.     WndClas.lpfnWndProc:= @WindowProc;
  159.     WndClas.cbClsExtra := 0;
  160.     WndClas.cbWndExtra := 0;
  161.     WndClas.hInstance := HInstance;
  162.     WndClas.hIcon := 0;
  163.     WndClas.hCursor := LoadCursor(0, IDC_Arrow);
  164.     WndClas.hbrBackground := GetStockObject(White_Brush);
  165.     WndClas.lpszMenuName := 'Menu';
  166.     WndClas.lpszClassName := 'GenWindow';
  167.     if not RegisterClass(WndClas) then
  168.       Halt;
  169.   end;
  170.   Window := CreateWindow('GenWindow', 'Menu Example', WS_OverLappedWindow,
  171.     CW_UseDefault, 0, CW_UseDefault, 0, 0, 0, hInstance, nil);
  172.   UpDateWindow(Window);
  173.   UserMenu:=CreatePopUpMenu;
  174.   InsertMenu(GetMenu(Window), 106, MF_ByCommand or MF_PopUp, UserMenu, 'User Define Menu');
  175.   ShowWindow(Window,Sw_ShowNormal);
  176.   while GetMessage(Msg, 0, 0, 0) do
  177.   begin
  178.     TranslateMessage(msg);
  179.     DispatchMessage(msg);
  180.   end;
  181. end;
  182.  
  183. begin
  184.   WinMain;
  185. end.
  186.